import sys
# sys模块负责程序与python解释器的交互，提供了一系列的函数和变量，用于操控python运行时的环境。
import os  #文件的读写操作
import time   #导入时间
import threading   #线程
import numpy as np
# import termios
# import tty    #常用函数和类
import pyprind   #进度条
import cv2
class CharFrame():  #   把一张图片转成字符图
    ascii_char = "$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzdTcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`."
    # 像素到字符的映射
    def pixelToChar(self,luminance):   #  luminance   灰度值
        return self.ascii_char[int(luminance/(256.0/len(self.ascii_char)))]
    # 将普通帧转化为ASCII 字符帧
    # limitSize 参数接受一个元组，表示图片的限宽限高
    # fill  表示是否用空格填充图片宽度至限宽，wrap表示是否在行末添加换行符
    def convert(self,img,limitSize=-1,fill=False,wrap=False):
        if limitSize != -1 and (img.shape[0] > limitSize[1] or img.shape[1] > limitSize[0]):
            img = cv2.resize(img,limitSize,interpolation=cv2.INTER_AREA)
        ascii_frame = ''
        blank = ''
        if fill:
            blank += ' '*(limitSize[0]-img.shape[1])
        if wrap:
            blank += '\n'
        for i in range(img.shape[0]):   #shape 为元组 图片的（宽高）
            for j in range(img.shape[1]):
                ascii_frame += self.pixelToChar(img[i,j])
            ascii_frame +=blank
        return ascii_frame

class I2Char(CharFrame):

    result = None
    np.set_printoptions(threshold=np.inf)

    def __init__(self,path,limitSize=-1,fill=False,wrap=False):
        # self.genCharImage(path,limitSize,fill,wrap)
        self.genCharImage(path,os.get_terminal_size(), True, False)

    def genCharImage(self,path,limitSize=-1,fill=False,wrap=False):

        # 给self.result 字符画字符串赋值
        '''
        cv2.imread(filepath,flags)
        第一个参数文件路径，
        第二个参数是通道数，-1代表原图与原图保持一致，0代表转换为灰度图，1代表使用BGR通道读入。
        默认是读进来直接是BGR（颜色值） 格式数据格式在 0~255，通道格式为(W,H,C
        '''
        img = cv2.imread(path,cv2.IMREAD_GRAYSCALE)
        # IMG = cv2.VideoCapture(path)
        # luminance = cv2.cvtColor(IMG,cv2.COLOR_BGR2GRAY)

        print("正在转换图片成字符画，请稍候...")
        self.result =self.convert(img,limitSize,fill,wrap)

    # def  file_write(self,filepath):
    #     with open('filepath','w')  as f:
    #         f.write(self.ascii_frame)
    def show(self,stream = 2):
        if self.result is None:
            return
        if stream == 1 and os.isatty(sys.stdout.fileno()):
            self.streamOut = sys.stdout.write
            self.streamFlush = sys.stdout.flush
        elif stream == 2 and os.isatty(sys.stderr.fileno()):
            self.streamOut = sys.stderr.write
            self.streamFlush = sys.stderr.flush
        elif hasattr(stream, 'write'):
            self.streamOut = stream.write
            self.streamFlush = stream.flush
        self.streamOut(self.result)
        self.streamFlush()
        self.streamOut('\n')

    '''
      通过命令行调用图片转字符画功能，命令行执行Python my_v2car.py t3.jpeg,输出字符画
    '''
if __name__ == '__main__':
    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument('file',
                        help='is a picture')
    parser.add_argument('-o','--output')
    args=parser.parse_args()
    i2char =I2Char(args.file)
    # i2char.genCharImage(args.file,os.get_terminal_size(),True,False)
    i2char.show()


